package com.test09_抽象类和接口;

import org.junit.Test;

/**
 * 代理设计模式
 */
public class YootkDemo_07 {

    /** 代理设计模式 */
    @Test
    public void test1() {
        IMessage message = new MessageProxy(new MessageImpl());
        message.send("沐言优拓：www.yootk.com");
    }

    /** 通过工厂获取代理对象 */
    @Test
    public void test2() {
        IMessage message = MessageFactory.getInstance();
        message.send("沐言优拓：www.yootk.com");
    }
}

interface IMessage {
    public void send(String msg);   // 消息发送
}

/**
 * 真实业务主题
 */
class MessageImpl implements IMessage {
    @Override
    public void send(String msg) {
        System.out.println("【核心业务 - 消息发送】" + msg);
    }
}

/**
 * 代理业务主题
 */
class MessageProxy implements IMessage {

    private IMessage messageObject;

    public MessageProxy(IMessage messageObject) {
        this.messageObject = messageObject;
    }

    @Override
    public void send(String msg) {
        if (this.connect()) {   // 调用代理主题
            this.messageObject.send(msg);   // 执行真实主题操作
        }
        this.close();   // 调用代理主题
    }

    public boolean connect() {
        System.out.println("【代理业务 - connect()】连接远程服务器，准备进行消息发送");
        return true;
    }

    public void close() {
        System.out.println("【代理业务 - close()】断开服务器连接，释放资源");
    }
}

/**
 * 通过工厂获取代理对象
 */
class MessageFactory {
    public static IMessage getInstance() {
        return new MessageProxy(new MessageImpl());
    }
}
